package com.zwx.heap;

import java.util.PriorityQueue;

/**
 * @author 文希
 * @create 2019-05-30 0:02
 */
public class Person implements Comparable<Person> {

    private int age;

    Person(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        return o.age - age;
    }

    @Override
    public String toString() {
        return "Person{" + "age=" + age + "}";
    }
}

class PriorityQueueDemo {
    //PriorityQueue:不允许空值，不支持不可比较的对象
    //若是自定义对象，队列要求对象使用Java Comparable 和 Comparator 接口给对象排序，然后再按照优先级来进行对于元素的处理。
    //非线程安全的，所以java提供了PriorityBlockingQueue（实现BlockingQueue接口）用于java多线程环境。
    public static void main(String[] args) {
        PriorityQueue<Person> queue = new PriorityQueue<>();
        Person person1 = new Person(31);
        Person person2 = new Person(22);
        Person person3 = new Person(65);
        Person person4 = new Person(15);
        Person person5 = new Person(28);

        /**
         * offer 插入新的元素 插入失败会返回false
         * add 插入新的元素 插入失败会抛异常
         */
        queue.offer(person1);
        queue.offer(person2);
        queue.offer(person3);
        queue.offer(person4);
        queue.offer(person5);

        int size = queue.size();

        /**
         * element 会弹出队首元素，但是并不会删除
         * peek 会弹出队首元素，但是也不会删除
         */
        for (int i = 0; i < size; i++) {
            /**
             * remove 移除队首元素 失败会抛异常
             * poll 移除队首元素 失败会返回null
             */
            Person person = queue.poll();
            System.out.println(person.toString());
        }
    }
}
